package tool;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

import org.json.JSONObject;

public class JSONObjectConverter {
    public final static SimpleDateFormat DATE_FORMAT;

    static {
        DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
    }

    public static <T> JSONObject convert(T element) {
        Field[] fields = element.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
        }
        Map<String, Object> map = new ConcurrentHashMap<String, Object>();
        for (Field field : fields) {
            try {
                String fieldName = field.getName();
                Object fieldValue = field.get(element);
                if (!(fieldValue instanceof Integer)) {
                    if (fieldValue instanceof Date) {
                        fieldValue = DATE_FORMAT.format(fieldValue);
                    } else if (fieldValue instanceof String) {
                        // 转义“<”字符
                        fieldValue = ((String) fieldValue).replaceAll("<", "&lt;");
                    }
                }
                map.put(fieldName, fieldValue);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        // 以指定的哈希映射构建一个JSON对象并添加至有序集合中
        JSONObject object = new JSONObject(map);
        return object;
    }

    /**
     * 如果有序集合内部没有Date类型的元素，那么可以直接将对象作为参数构建JSON对象实例。
     * <p>
     * 否则，请使用迭代有序集合内的泛型类的字段，并将这些字段的名称和值作为哈希映射的键和值，
     * <p>
     * 以哈希映射作为参数构建JSON对象实例，再将这些实例添加至JSON对象的有序集合中。
     * <p>
     * <b>注：如果元素的某个get方法在去除get前缀后的名称并不对应某个私有字段的名称，
     * <p>
     * 那么请勿将元素直接作为构建JSON对象实例的参数。
     * 
     * @param <T>
     * @param elements
     * @return
     */
    public static <T> List<JSONObject> convert(List<T> elements) {
        Field[] fields = null;
        List<JSONObject> objects = new ArrayList<>(elements.size());
        for (int index = 0; index < elements.size(); index++) {
            T element = elements.get(index);
            if (index == 0) {
                fields = element.getClass().getDeclaredFields();
                for (Field field : fields) {
                    field.setAccessible(true);
                }
            }
            Map<String, Object> map = new ConcurrentHashMap<String, Object>();
            for (Field field : fields) {
                try {
                    String fieldName = field.getName();
                    Object fieldValue = field.get(element);
                    if (!(fieldValue instanceof Integer)) {
                        if (fieldValue instanceof Date) {
                            fieldValue = DATE_FORMAT.format(fieldValue);
                        } else if (fieldValue instanceof String) {
                            // 转义“<”字符
                            fieldValue = ((String) fieldValue).replaceAll("<", "&lt;");
                        }
                    }
                    if (Objects.nonNull(fieldValue)) {
                        map.put(fieldName, fieldValue);
                    }
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            // 以指定的哈希映射构建一个JSON对象并添加至有序集合中
            JSONObject object = new JSONObject(map);
            objects.add(object);
        }
        return objects;
    }
}
